/*
地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一格（不能移动到方格外），也不能进入行坐标和列坐标的数位之和大于k的格子。例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？

 

示例 1：

输入：m = 2, n = 3, k = 1
输出：3
示例 1：

输入：m = 3, n = 1, k = 0
输出：1
提示：

1 <= n,m <= 100
0 <= k <= 20

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
class Solution {
public:
    int getNum(int m)
    {
        int nRetSum = 0;
        while (m)
        {
            nRetSum += m % 10;
            m = m / 10;
        }

        return nRetSum;
    }
    int movingCount(int m, int n, int k) {
        int nRetCount = 0;
        int** nFlag;

        nFlag = new int* [m];
        for (int i = 0; i < m; ++i)
        {
            nFlag[i] = new int[n];
            memset(nFlag[i], 0, sizeof(int) * n);
        }

        nFlag[0][0] = 1;
        for (int i = 0, j = 0; i < m; ++i)
        {
            for (j = 0; j < n; ++j)
            {
                if (i == 0 && j == 0)
                {
                    nRetCount++;
                    continue;
                }

                if (nFlag[max(0, i - 1)][max(0, j - 1)] == 1 || 
                    nFlag[i][max(0, j - 1)] == 1 ||
                    nFlag[max(0, i - 1)][j] == 1)
                {
                    if ((getNum(i) + getNum(j)) <= k)
                    {
                        nRetCount++;
                        nFlag[i][j] = 1;
                    }
                }
            }
        }

        for (int i = 0; i < m; ++i)
        {
            delete[] nFlag[i];
        }
        delete[] nFlag;

        return nRetCount;
    }
};
